package cn.lucky.thread.start;

/**
 * @Author:蒋凌鹏
 * @Date:2020/9/16
 * @Explain:javaseries
 * 创建线程的几种方式的实现
 */
public class StartThreadByExtends {

    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();

        /**
         * 偷懒写法,匿名Thread的写法
         */
        new Thread(){
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    if (i % 3 == 0){
                        System.out.println(Thread.currentThread().getName() + ":" + i);
                    }
                }
            }
        }.start();

        /**
         * 实现Runnable接口的方式创建线程
         *
         */
        new Thread(new ImplementRunnableInterface()).start();


        /**
         * 通过匿名内部类的方式创建线程
         */
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    if (i % 2 == 0){
                        System.out.println(Thread.currentThread().getName() + ":" + i);
                    }
                }
            }
        }).start();
    }
}

/**
 * 创建线程的方式一：通过继承Thread类，重写run方法来实现线程的创建
 *  1.创建一个继承Thread类的子类
 *  2.在子类中重写run()方法，run方法中执行该线程需要处理的操作  commonMethod
 *  3.创建继承Thread的子类的对象
 *  4.通过该对象调用start()，启动线程.
 */
class MyThread extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            if (i % 2 == 0){
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
        }
    }
}


/**
 * 创建线程方式二：实现Runnable接口，创建线程
 *  1.定义Runnable接口的实现类，并重写该接口的run()方法，该run()方法的方法体也称为线程方法执行体。
 *  2.创建Runnable实现类的实例，并将此实例作为形参传入new Thread()的构造函数中，就可以创建Thread线程对象，也可以使用匿名内部类的方式。
 */
class ImplementRunnableInterface implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            if (i % 2 == 0){
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
        }
    }
}